package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.dto.OrderSeparateDTO;
import com.ssy.lingxi.order.model.vo.basic.request.OrderCouponVO;
import com.ssy.lingxi.order.model.vo.vendor.response.VendorOrderCouponVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 订单关联的优惠券相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-09-23
 */
public interface IBaseOrderCouponService {
    /**
     * （拆单）根据拆单订单商品金额总和，加权平均计算拆单后的优惠券金额
     * @param couponAmount    订单优惠券总金额
     * @param couponAmountMap 拆单订单商品金额总和
     * @return 拆单订单优惠券金额
     */
    Map<OrderSeparateDTO, BigDecimal> findSeparateOrderCouponAmount(BigDecimal couponAmount, Map<OrderSeparateDTO, BigDecimal> couponAmountMap);

    /**
     * （拆单）根据拆单订单商品金额总和，加权平均计算拆单后的优惠券金额
     * @param separateSkuMap    拆单商品Sku列表
     * @param skuCouponMap   Sku优惠券减少的金额
     * @return 拆单订单优惠券金额
     */
    Map<OrderSeparateDTO, BigDecimal> findSeparateOrderCouponAmount(Map<OrderSeparateDTO, List<Long>> separateSkuMap, Map<Long, BigDecimal> skuCouponMap);

    /**
     * 校验、保存订单关联的优惠券列表
     * @param order 订单
     * @param coupons 优惠券列表
     * @return 保存结果
     */
    Wrapper<Void> checkOrderCoupons(OrderDO order, List<OrderCouponVO> coupons);

    /**
     * 查询订单优惠券列表
     * @param order 订单
     * @return 查询结果
     */
    Wrapper<List<VendorOrderCouponVO>> findOrderCoupons(OrderDO order);
}
